package spark.core.acc

import org.apache.spark.{SparkConf, SparkContext}

object Accumulator {
  // Todo 累加器
  // 累加器用来把Executor端变量信息聚合到Driver端。
  // 在Driver程序中定义的变量，在 Executor端的每个Task都会得到这个变量的一份新的副本，
  // 每个task更新这些副本的值后， 传回Driver端进行merge。
  def main(args: Array[String]): Unit = {

    val sparkConf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("Accumulator")
    val sc: SparkContext = new SparkContext(sparkConf)

    val RDD = sc.makeRDD(List(1, 2, 3, 4, 5))
    // 声明累加器
    val sum = sc.longAccumulator("sum")
    //    val mapRDD = RDD.map(num => sum.add(num))
    RDD.foreach(
      num => {
        // 使用累加器
        sum.add(num)
      }
    )
    // 获取累加器的值
    println("sum = " + sum.value)
  }


}
